home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / aros / c / newshell.c < prev    next >
C/C++ Source or Header  |  1996-09-13  |  2KB  |  128 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: newshell.c,v 1.3 1996/09/13 17:52:11 digulla Exp $
  4.     $Log: newshell.c,v $
  5.     Revision 1.3  1996/09/13 17:52:11  digulla
  6.     Use IPTR
  7.  
  8.     Revision 1.2  1996/08/01 17:40:45  digulla
  9.     Added standard header for all files
  10.  
  11.     Desc:
  12.     Lang:
  13. */
  14. #include <exec/memory.h>
  15. #include <clib/exec_protos.h>
  16. #include <dos/dosextens.h>
  17. #include <dos/dostags.h>
  18. #include <clib/dos_protos.h>
  19. #include <utility/tagitem.h>
  20.  
  21. CALLENTRY /* Before the first symbol */
  22.  
  23. struct ExecBase *SysBase;
  24. struct DosLibrary *DOSBase;
  25.  
  26. static LONG tinymain(void);
  27.  
  28. LONG entry(struct ExecBase *sysbase)
  29. {
  30.     LONG error=RETURN_FAIL;
  31.     SysBase=sysbase;
  32.     DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",39);
  33.     if(DOSBase!=NULL)
  34.     {
  35.     error=tinymain();
  36.     CloseLibrary((struct Library *)DOSBase);
  37.     }
  38.     return error;
  39. }
  40.  
  41. static LONG tinymain(void)
  42. {
  43.     STRPTR args[2]={ "CON:", "S:Shell-Startup" };
  44.     struct RDArgs *rda;
  45.     BPTR lock, in, out, shell;
  46.     STRPTR s1, s2, s3, buf;
  47.     struct Process *process;
  48.     LONG error=RETURN_ERROR;
  49.  
  50.     rda=ReadArgs("WINDOW,FROM",(IPTR *)args,NULL);
  51.     if(rda!=NULL)
  52.     {
  53.     s1=s2=(STRPTR)args[1];
  54.     while(*s2++)
  55.         ;
  56.     buf=(STRPTR)AllocVec(6+2*(s2-s1),MEMF_ANY);
  57.     if(buf!=NULL)
  58.     {
  59.         CopyMem("FROM ",buf,5);
  60.         s3=buf+5;
  61.         s2=s1;
  62.         *s3++='\"';
  63.         while(*s1)
  64.         {
  65.         if(*s1=='*'||*s1=='\"'||*s1=='\n')
  66.             *s3++='*';
  67.         if(*s1=='\n')
  68.             *s3++='n';
  69.         else
  70.             *s3++=*s1;
  71.         s1++;
  72.         }
  73.         *s3++='\"';
  74.         *s3=0;
  75.  
  76.         shell=LoadSeg("c:shell");
  77.         if(shell)
  78.         {
  79.         out=Open(args[0],MODE_READWRITE);
  80.         if(out)
  81.         {
  82.             /* Clone output filehandle */
  83.             lock=DupLockFromFH(out);
  84.             if(lock)
  85.             {
  86.             in=OpenFromLock(lock);
  87.             if(!in)
  88.                 UnLock(lock);
  89.             }else
  90.             in=0;
  91.             if(in)
  92.             {
  93.             struct TagItem tags[]=
  94.             {
  95.                 { NP_Arguments, 0 },
  96.                 { NP_Input, 0 },
  97.                 { NP_Output, 0 },
  98.                 { NP_Error, 0 },
  99.                 { NP_Seglist, 0 },
  100.                 { NP_Cli, 1 },
  101.                 { TAG_END, 0 }
  102.             };
  103.             tags[0].ti_Data=(IPTR)buf;
  104.             tags[1].ti_Data=in;
  105.             tags[2].ti_Data=out;
  106.             tags[4].ti_Data=shell;
  107.             process=CreateNewProc(tags);
  108.             if(process!=NULL)
  109.             {
  110.                 out=in=shell=0;
  111.                 error=0;
  112.             }
  113.             Close(in);
  114.             }
  115.             Close(out);
  116.         }
  117.         UnLoadSeg(shell);
  118.         }
  119.         FreeVec(buf);
  120.     }
  121.     FreeArgs(rda);
  122.     }else
  123.     error=RETURN_FAIL;
  124.     if(error)
  125.     PrintFault(IoErr(),"NewShell");
  126.     return error;
  127. }
  128.